package com.mipo.singleton.lazy.threadsafe.doublechecklocking;

/**
 * Double Check Locking双检查锁机制(推荐)
 * 为了达到线程安全,又能提高代码执行效率，我们这里可以采用DCL的双检查锁机制来完成,多线程下下运行,该中方法保证了多线程并发下的线程安全性。
 * 这里在声明变量时使用了volatile关键字来保证其线程间的可见性,在同步代码块中使用二次检查,以保证其不被重复实例化。
 * 结合其二者,这种实现方式既保证了其高效性,也保证了其线程安全性。
 * @author kitty
 */
public class DoubleCheckLockingSingleton {

	// 使用volatile关键字保其可见性
	volatile private static DoubleCheckLockingSingleton instance = null;

	private DoubleCheckLockingSingleton() {}

	public static DoubleCheckLockingSingleton getInstance() {
		try {
			if (instance == null) {
				// 创建实例之前可能会有一些准备性的耗时工作
				Thread.sleep(300);
				synchronized (DoubleCheckLockingSingleton.class) {
					if (instance == null) {// 二次检查
						instance = new DoubleCheckLockingSingleton();
					}
				}
			}
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		return instance;
	}
}


